//-----------------------------------------------------------------------------
// MAIN.c
//-----------------------------------------------------------------------------
// Copyright 	rarias 2008
// Date: 		15 dic 2008
// Target: 		C8051F320
// Tool chain: 	KEIL C51 6.03 / KEIL EVAL C51
// Version:		1.0
// 
// Pasos a cubrir:
//				Led on/off

//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include "c8051F320.h"
#include "USB_API.h"
#include "USB_BL_APP_Shared.h"
#include "main.h"
#include "adc.h"
#include "usb_command.h"
#include <stddef.h>

// global variable
BYTE			estado		=	ST_NORMAL;
BYTE			subestado	= 	0x00;
BYTE			led_status	=	LED_BLINK;

unsigned xdata raw_buffer[RAW_BUFFER_SIZE];
unsigned raw_buffer_next;

//-----------------------------------------------------------------------------
// Main Routine
//-----------------------------------------------------------------------------
void main(void)
{
	unsigned long DelayCount=0;

	Main_Initialize();
	Init_Principal();
	
	while (1) { // por siempre ...
		Ciclo_Principal();

		// TODO: activar watchdog y escribirle aca
		if (!(P2 & BootSwitch) || (Out_Packet[5] == 0x15) || (DelayCount > 0) ) {
			In_Packet[5] = 0x05;             // Indicate entering bootload mode
			DelayCount++;
		}

		// Delay so that previous In_Packet can be sent to the PC
		if (DelayCount > 45000) {
			EA = 0;           // Disable all interrupts
			BOOTLOAD_REQ();   // Call bootloader
		}
	}
}

void Init_Principal (void)
{
	int delay = 100000;
	led_status = LED_BLINK;
	raw_buffer_next = 0;
}

void Ciclo_Principal (void)
{
	if (adc_buffer_first != adc_buffer_last) {
		if (raw_buffer_next != RAW_BUFFER_SIZE) {
			raw_buffer[raw_buffer_next] = adc_measure_buffer[adc_buffer_first];
			raw_buffer_next += 1;
		} else {
			// drop y anuncio
			TestLed = !TestLed;
		}
		adc_buffer_first = (adc_buffer_first + 1) % ADC_BUFFER_SIZE;
	}
}

#define LED_ENCENDIDO 0
#define LED_APAGADO 1
//-----------------------------------------------------------------------------
// Subrutinas de inicializaci'on
//-----------------------------------------------------------------------------

void Main_Initialize (void)
{
	PCA0MD &= ~0x40;   // deshabilito watchdog

	CLKSEL &= ~0x03;   // Clock del sistema interno (SYSCLK)
	OSCICN |= 0x03;    // de 12MHz (12MHz dividido 1) ((1<<IFCN1)|(1<<IFCN0));
      
        TestLed = LED_APAGADO;

	Port_Init();       // Initialize crossbar and GPIO

	USB_Clock_Start(); // Configura el clock para el USB
	                   // OJO! no modificar OSCICN.7-5 ni CLKSEL.6-4
	                   // Se pueden cambiar OSCICN.IFCN1-0 y CLKSEL.CLKSL1-0
	USB_Init(VID,PID,MFRSTR,PRDSTR,SERIAL,MAXPOWER,PWATTRIBUTES,BCDDEVICE);
	                   // Habilita la interfaz USB e interrupciones
	USB_Int_Enable();  // Permite interrupciones de la interfaz USB

	init_adc();
}

//-----------------------------------------------------------------------------
// Configuraci'on de puertos, conexi'on de perif'ericos y habilitaci'on del
// crossbar.
//-----------------------------------------------------------------------------
void Port_Init(void)					   
{
	P0MDIN	= 0xFF; // x default - todas son entradas digitales
	P0MDOUT = 0x08; // Port 0.0-7 entradas digitales open-drain
	P0      = 0xFF; // Port 0.0-7 digital input
	P0SKIP	= 0x00; // nada que saltear de P0

	P1MDIN	= 0xFE; // P1.0 entrada al ADC
	P1MDOUT	= 0x00; // salidas open-drain
	P1      = 0xFF; // sin pull up
	P1SKIP  = 0x01; // salteo P1.0

	P2MDIN	= 0xFF; // x default - todas son entradas digitales
	P2MDOUT = 0x0C; // P2.0,1 salidas open-drain, P2.2,3 salidas push-pull
	P2      = 0xFF;
	P2SKIP	= 0x00; // Nada que saltear de P2
	
	XBR0	= 0x00; // desconecto UART0 (TX0=P0.4 y RX0=P0.5)
	XBR1	= 0x40; // Habilito Crossbar (conecto los perifericos con los puertos)
}

